<!DOCTYPE HTML>
<html>
<head>

    <title>El uso de Espacios de Nombres en Plan 9</title>

    <link rel="stylesheet" href="/pub/style/style.css" type="text/css" media="screen, handheld" title="default">
    <link rel="shortcut icon" href="/favicon.ico" type="image/vnd.microsoft.icon">

    <meta charset="UTF-8">
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 


<meta name="verify-v1" content="6zEoK0WMlnLmIS/w7Pnh6+srZECHsvnMGN0kQmowSGk=" />
<meta name="google-site-verification" content="z5zCyEitNLNZmhVblsogrEiy6Acf0UZROsFMtLjioN4" />
<META name="y_key" content="49dff3fad5352458"><META name="y_key" content="5dc40bfee9494e98"><META name="y_key" content="b60a53d1fa98f4c8">
<meta name="msvalidate.01" content="5008C6E6B172BEB1F43E770296C3D560" />
<meta name="alexaVerifyID" content="l1vBNiKWqe9hCZhp0jV8OKPyjps" />

    

</head>
<body>

<div id="header">
    <div class="superHeader">
    <div class="left">
      <a href="http://quotes.cat-v.org">quotes</a> |
      <a href="http://doc.cat-v.org">docs</a> |
      <a href="http://repo.cat-v.org">repo</a> |
      <a href="http://go-lang.cat-v.org">golang</a> |
      <a href="http://sam.cat-v.org">sam</a> |
      <a href="http://man.cat-v.org">man</a> |
      <a href="http://acme.cat-v.org">acme</a> |
      <a href="http://glenda.cat-v.org">Glenda</a> |
      <a href="http://ninetimes.cat-v.org">9times</a> |
      <a href="http://harmful.cat-v.org">harmful</a> |
      <a href="http://9p.cat-v.org/">9P</a> |
      <a href="http://cat-v.org">cat-v.org</a>
    </div>

    <div class="right">

      <span class="doNotDisplay">Related sites:</span>
      | <a href="http://cat-v.org/update_log">site updates</a>
      | <a href="/sitemap">site map</a> |

    <script type="text/javascript">var addthis_disable_flash = true; var addthis_pub="uriell";</script>
    <a href="http://www.addthis.com/bookmark.php?v=20" onmouseover="return addthis_open(this, '', '[URL]', '[TITLE]')" onmouseout="addthis_close()" onclick="return addthis_sendto()"><img src="http://s7.addthis.com/static/btn/lg-share-en.gif" width="125" height="16" alt="Bookmark and Share" style="border:0"/></a><script type="text/javascript" src="http://s7.addthis.com/js/200/addthis_widget.js"></script>
    </div>

    </div>

    <div class="midHeader">
    <h1 class="headerTitle"><a href="/">/sys/doc/ <span id="headerSubTitle">Documentation archive</span></a></h1>
    </div>
    
    <div class="subHeader"><br></div>
</div>

    <div id="side-bar">
        <div>
<p class="sideBarTitle">Sections:</p>
<ul>
<li><a href="/bell_labs/">&rsaquo; bell labs/</a></li>
<li><a href="/economics/">&rsaquo; economics/</a></li>
<li><a href="/henry_spencer/">&rsaquo; henry spencer/</a></li>
<li><a href="/inferno/">&rsaquo; inferno/</a></li>
<li><a href="/plan_9/" class="thisPage">&raquo;<i> plan 9/</i></a></li>
<li><ul>
<li><a href="/plan_9/1st_edition/">&rsaquo; 1st edition/</a></li>
<li><a href="/plan_9/2nd_edition/">&rsaquo; 2nd edition/</a></li>
<li><a href="/plan_9/3rd_edition/">&rsaquo; 3rd edition/</a></li>
<li><a href="/plan_9/4th_edition/">&rsaquo; 4th edition/</a></li>
<li><a href="/plan_9/IWP9/">&rsaquo; IWP9/</a></li>
<li><a href="/plan_9/blue_gene/">&rsaquo; blue gene/</a></li>
<li><a href="/plan_9/humour/">&rsaquo; humour/</a></li>
<li><a href="/plan_9/misc/">&rsaquo; misc/</a></li>
<li><a href="/plan_9/programming/">&rsaquo; programming/</a></li>
<li><a href="/plan_9/real_time/">&rsaquo; real time/</a></li>
<li><a href="/plan_9/translations/" class="thisPage">&raquo;<i> translations/</i></a></li>
<li><ul>
<li><a href="/plan_9/translations/russian/">&rsaquo; russian/</a></li>
<li><a href="/plan_9/translations/spanish/" class="thisPage">&raquo;<i> spanish/</i></a></li>
<li><ul>
<li><a href="/plan_9/translations/spanish/8">&rsaquo; 8</a></li>
<li><a href="/plan_9/translations/spanish/9">&rsaquo; 9</a></li>
<li><a href="/plan_9/translations/spanish/names" class="thisPage">&raquo;<i> names</i></a></li>
<li><a href="/plan_9/translations/spanish/net">&rsaquo; net</a></li>
</ul></li>
</ul></li>
</ul></li>
<li><a href="/political_science/">&rsaquo; political science/</a></li>
<li><a href="/programming/">&rsaquo; programming/</a></li>
<li><a href="/unix/">&rsaquo; unix/</a></li>
<li><a href="/xml/">&rsaquo; xml/</a></li>
</ul>
        </div>
        <div>
<ul>
<li><a href="http://man.cat-v.org/plan_9/">- Plan 9 Man Pages</a></li>
<li><a href="http://ninetimes.cat-v.org">- NineTimes News</a></li>
</ul>
        </div>
    </div>

<div id="main-copy">



<p style="margin-top: 0; margin-bottom: 0.50in"></p>
<p style="margin-top: 0; margin-bottom: 0.21in"></p>

<p style="line-height: 1.4em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: center;">
<span style="font-size: 12pt"><b>El uso de Espacios de Nombres en Plan 9</b></span></p>
<p style="margin-top: 0; margin-bottom: 0.21in"></p>

<p style="margin-top: 0; margin-bottom: 0.17in"></p>
<p style="line-height: 1.4em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: center;">
<span style="font-size: 10pt"><i>Rob Pike</i></span></p>
<p style="line-height: 1.4em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: center;">
<span style="font-size: 10pt"><i>Dave Presotto</i></span></p>
<p style="line-height: 1.4em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: center;">
<span style="font-size: 10pt"><i>Ken Thompson</i></span></p>
<p style="line-height: 1.4em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: center;">
<span style="font-size: 10pt"><i>Howard Trickey</i></span></p>
<p style="line-height: 1.4em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: center;">
<span style="font-size: 10pt"><i>Phil Winterbottom</i></span></p>
<p style="margin-top: 0; margin-bottom: 0.17in"></p>

<p style="margin-top: 0; margin-bottom: 0.08in"></p>
<p style="line-height: 1.4em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: center;">
<span style="font-size: 10pt">??????.MH</span></p>
<p style="line-height: 1.4em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: center;">
<span style="font-size: 10pt">USA</span></p>
<p style="margin-top: 0; margin-bottom: 0.17in"></p>

<p style="margin-top: 0; margin-bottom: 0.33in"></p>
<p style="line-height: 1.4em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: center;">
<span style="font-size: 10pt"><i>ABSTRACT</i></span></p>
<p style="margin-top: 0; margin-bottom: 0.19in"></p>
<p style="margin-top: 0; margin-bottom: 0.17in"></p>

<p style="margin-top: 0; margin-bottom: 0.17in"></p>

<p style="margin-top: 0; margin-bottom: 0.17in"></p>

<p style="line-height: 1.2em; margin-left: 1.50in; text-indent: 0.00in; margin-right: 1.50in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Plan 9 es un sistema distribuido creado en el Computing Sciences Research Center de los Laboratorios Bell de AT&amp;T (ahora Lucent Technologies, Bell Labs) durante los últimos años.
Su objetivo es proporcionar un sistema de calidad para el desarrollo de software y la computación en general utilizando hardware heterogeneo y un software mínimo. Un sistema Plan 9 comprende servidores de ficheros y de CPU en un lugar centralizado conectados mediante redes rápidas.
Mediante redes más lentas se contecta con máquinas de tipo estación de trabajo que actúan como terminales.
Plan 9 demuestra que mediante una serie de abstracciones cuidadosamente implementadas es posible producir un sistema operativo pequeño que proporcione soporte para grandes sistemas en una varidad de arquitecturas y redes.
Los cimientos del sistema se basan en dos ideas: un espacio de nombres por proceso y un sencillo protocolo de sistema de ficheros orientado a mensajes.
</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p>

<p style="margin-top: 0; margin-bottom: 0.17in"></p>
<p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="margin-top: 0; margin-bottom: 0.50in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">El sistema operativo para los servidores de CPU y los terminales está estructurado como un nucleo tradicional: una sola imagen compilada que contiene código de gestión de recursos, control de procesos, procesos de usuario, memoria virtual y E/S. Debido a que el servidor de ficheros es una máquina separada, el sistema de ficheros no va compilado dentro, pero sí el manejo del espacio de nombres, algo propio de cada proceso.
El nucleo entero para la máquina multiprocesador SGI Power Series ocupa 25000 lineas de código en C, la mayor parte del cual se ocupa del manejo de red, incluyendo Ethernet y la suite de protocolos de Internet.
Menos de 1500 lineas son específicas de cada máquina, y un nucleo funcional con E/S mínima puede montarse con un total de 6000 lineas. [Pike90]
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">El sistema es relativamente pequeño por varias razones. Primero, todo es nuevo: no ha tenido tiempo de que se le acumulen los parches y las características de otros sistemas.
También, aparte del protocolo de red, no se adhiere a ningún interfaz externo; en particular, no es compatible con UNIX. La economía se consigue con una selección cuidadosa de servicios e interfaces. Finalmente, en lo posible, el sistema se construye en base a dos ideas simples:
cada recurso del sistema, sea local o remoto, se presenta mediante un sistema de ficheros jerárquico; y un proceso de usuario ensambla una vista privada del sistema construyendo un 
</span><span style="font-size: 10pt"><i>espacio de nombres 
</i></span><span style="font-size: 10pt">de ficheros que conecta estos recursos. [Needham]
</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt"><b>Protocolo de ficheros
</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Todos los recursos en Plan 9 parecen sistemas de ficheros.
Esto no significa que sean repositorios para ficheros permanentes en disco, sino que el interfaz con ellos es orientado a ficheros: encontrar ficheros (recursos) en un arbol de nombres jerárquico, engancharse a ellos por su nombre, acceder a sus contenidos por medio de llamadas read y write.
Hay docenas de tipos de sistemas de ficheros en Plan 9, pero solo unos pocos presentan ficheros tradicionales.
En este nivel de abstracción, los ficheros en Plan 9 son similares a objetos, excepto que los ficheros ya tienen un nombre, métodos de acceso y de protección que deben ser creados de nuevo para los objetos. Los lectores expertos en objetos, pueden aprovechar el resto de este documento para estudiar la forma de hacer que los objetos parezcan ficheros.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">El interfaz con sistemas de ficheros está definido por un protocolo, llamado 9P, análogo, aunque diferente, al protocolo NFS.
Este protocolo habla de ficheros, no de bloques; dada una conexión con el directorio raíz de un servidor de ficheros, los mensajes 9P navegan por la jerarquía de ficheros, abren ficheros para E/S, y leen o escriben bytes en los ficheros.
9P contiene 17 tipos de mensajes: 3 para inicialización y autenticación de una conexión y 14 para manipulación de objetos.
Los mensajes se generan por el nucleo como respuesta a solicitudes de E/S del usuario o del propio nucleo.
Este es un vistazo rápido a los tipos de mensajes.
Los mensajes
</span><span style="font-size: 10pt"><tt>auth</tt></span><span style="font-size: 10pt">
y
</span><span style="font-size: 10pt"><tt>attach</tt></span><span style="font-size: 10pt">
autentican una conexión, establecida por medios externos a 9P, y validan a su usuario.
El resultado es un 
</span><span style="font-size: 10pt"><i>canal</i></span><span style="font-size: 10pt">
??????
que apunta a la raíz del servidor.
that points to the root of the server.
??????
El mensaje
</span><span style="font-size: 10pt"><tt>clone</tt></span><span style="font-size: 10pt">
crea un nuevo canal idéntico a uno existente, que puede ser movido a un fichero del servidor usando el mensaje
</span><span style="font-size: 10pt"><tt>walk</tt></span><span style="font-size: 10pt">
para descender cada nivel en la jerarquía.
Los mensajes
</span><span style="font-size: 10pt"><tt>stat</tt></span><span style="font-size: 10pt">
y
</span><span style="font-size: 10pt"><tt>wstat</tt></span><span style="font-size: 10pt">
leen y escriben los atributos del fichero al que apunta el canal.
El mensaje
</span><span style="font-size: 10pt"><tt>open</tt></span><span style="font-size: 10pt">
prepara el canal para su uso mediante 
</span><span style="font-size: 10pt"><tt>read</tt></span><span style="font-size: 10pt">
o  
</span><span style="font-size: 10pt"><tt>write</tt></span><span style="font-size: 10pt">
que acceden al contenido del fichero, mientras que 
</span><span style="font-size: 10pt"><tt>create</tt></span><span style="font-size: 10pt">
y   
</span><span style="font-size: 10pt"><tt>remove</tt></span><span style="font-size: 10pt">
realizan la acción que su nombre indica.
El mensaje
</span><span style="font-size: 10pt"><tt>clunk</tt></span><span style="font-size: 10pt">
descarta un canal sin afectar al fichero.
Ninguno de los mensajes 9P considera el cacheo; se proporcionan cachés, en caso de necesidad, o bien dentro del servidor (caché centralizado) o implementándolo como un sistema de ficheros transparente entre el cliente y la conexión 9P con el servidor (caché de cliente).
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Por eficiencia, la conexión a sistemas de ficheros residentes en el nucleo, incorrectamente llamados  
</span><span style="font-size: 10pt"><i>dispositivos,</i></span><span style="font-size: 10pt">
se realiza mediante llamadas normales, en lugar de llamadas remotas.
Los procedimientos corresponden uno a uno con tipos de mensajes 9P.
Localmente cada canal tiene una estructura de datos asociada que guarda un campo de tipo usado para indexar una tabla de llamadas a procedimiento, un conjunto por tipo de sistema de ficheros, análogo a seleccionar el conjunto de métodos de un objeto.
En sistemas de ficheros residentes en el nucleo, el 
</span><span style="font-size: 10pt"><i>dispositivo mount,
</i></span><span style="font-size: 10pt">convierte las llamadas locales a procedimientos 9P en mensajes RPC a servicios remotos sobre un protocolo de transporte proporcionado externamente como TCP o IL, un nuevo protocolo de datagrama fiable, o sobre un pipe a un proceso de usuario.
Llamadas a write y read transmiten los mensajes sobre la capa de transporte. El dispositivo mount es el único puente entre el interfaz procedural que ven los programas de usuario y los servicios remotos y de nivel de usuario.
Hace toda la clasificación, manejo de buffers y multiplexado y es el único mecanismo íntegramente RPC de Plan 9.
En realidad es un objeto proxy.
No hay compilador de stubs RPC; en lugar de eso, el driver de montaje y todos los servidores simplemente comparten una librería que empaqueta y desempaqueta mensajes 9P.
</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt"><b>Ejemplos
</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Un tipo de sistema de ficheros sirve ficheros permanentes desde el servidor de ficheros principal, un sistema stand-alone munltiprocesador con una jukebox optica WORM de 350 gigabytes que guarda los datos, precedido por un caché de bloques que comprende 7 gigabytes de disco magnético y 128 megabytes de RAM.
Los clientes se conectan al servidor de ficheros usando alguna de las múltiples redes y protocolos y accede a los ficheros usando 9P.
El servidor de ficheros ejecuta un sistema operativo distinto y no tiene soporte para procesos de usuario; aparte de un conjunto restringido de comandos disponibles en la consola, todo lo que hace es contestar a mensajes 9P de sus clientes.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">?????
Diariamente, a las 5:00 AM, el servidor de ficheros hace un barrido por los bloques del caché y marca los bloques sucios para ser copiados.
Once a day, at 5:00 AM,
the file server sweeps through the cache blocks and marks dirty blocks
copy-on-write.
?????
Crea una copia del directorio raíz y la etiqueta con la fecha actual, por ejemplo
</span><span style="font-size: 10pt"><tt>1995/0314</tt></span><span style="font-size: 10pt">.
Luego empieza un proceso en background para copiar los bloques ???????? sucios ????????  en el WORM.
El resultado es que el servidor retiene una imagen del sistema de ficheros tal como estaba cada mañana.
El conjunto de antiguos directorios raíz es accesible usando 9P, así que un cliente puede examinar los ficheros de backup usando comandos normales.
Tener un servicio de backup implementado como un sistema de ficheros normal tiene sus ventajas.
La más obvia es que se puede acceder a él con comandos ordinarios.
Por ejemplo, para ver cuándo se ha reparado un fallo
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.40in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">El servidor de ficheros es solamente un tipo de sistema de ficheros. El nucleo proporciona un número inusual de servicios como sistemas locales de ficheros. 
Estos servicios no estan limitados a dispositivos de E/S como discos. Incluyen dispositivos de red y sus protocolos asociados, la pantalla y el ratón, una representación de procesos similar a 
</span><span style="font-size: 10pt"><tt>/proc</tt></span><span style="font-size: 10pt">
[Killian], los pares nombre/valor que forman el entorno pasado a cada nuevo proceso, servicios de profiling, y otros recursos.
Cada uno de ellos se representa como un sistema de ficheros &mdash; directorios que contienen conjuntos de ficheros &mdash; 
pero los ficheros que lo constituyen no representan almacenamiento permanente en disco.
Son más parecidos a dispositivos de UNIX.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.40in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Por ejemplo, el dispositivo
</span><span style="font-size: 10pt"><i>console</i></span><span style="font-size: 10pt">
contiene el fichero
</span><span style="font-size: 10pt"><tt>/dev/cons</tt></span><span style="font-size: 10pt">,
simirar al fichero de UNIX
</span><span style="font-size: 10pt"><tt>/dev/console</tt></span><span style="font-size: 10pt">:
cuando es escribe en él, 
</span><span style="font-size: 10pt"><tt>/dev/cons</tt></span><span style="font-size: 10pt">
agrega el dato en la pantalla; cuando se lee, devuelve los caracteres que se han tecleado.
Otros ficheros del dispositivo console son
</span><span style="font-size: 10pt"><tt>/dev/time</tt></span><span style="font-size: 10pt">,
el número de segundos desde epoch,
</span><span style="font-size: 10pt"><tt>/dev/cputime</tt></span><span style="font-size: 10pt">,
el tiempo de computación usado por el proceso que está leyendo el dispositivo,
</span><span style="font-size: 10pt"><tt>/dev/pid</tt></span><span style="font-size: 10pt">,
el id de dicho proceso, y 
</span><span style="font-size: 10pt"><tt>/dev/user</tt></span><span style="font-size: 10pt">,
el nombre de login del usuario que está accediendo al dispositivo.
Todos estos ficheros contienen texto, no números binarios, así que su uso está libre de problemas de orden de bytes.
Sus contenidos se sintetizan bajo demanda cuando se leen; cuando se escriben, modifican estructuras de datos del nucleo.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.40in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">El dispositivo
</span><span style="font-size: 10pt"><i>process</i></span><span style="font-size: 10pt">
contiene un directorio por proceso local activo, que se llama igual que el id numérico del proceso:
</span><span style="font-size: 10pt"><tt>/proc/1</tt></span><span style="font-size: 10pt">,
</span><span style="font-size: 10pt"><tt>/proc/2</tt></span><span style="font-size: 10pt">,
etc.
Cada directorio contiene un conjunto de ficheros que acceden al proceso.
Por ejemplo, en cada directorio, el fichero
</span><span style="font-size: 10pt"><tt>mem</tt></span><span style="font-size: 10pt">
es una imagen de la memoria virtual del proceso que puede ser leida o escrita para debugging.
El fichero
</span><span style="font-size: 10pt"><tt>text</tt></span><span style="font-size: 10pt">
es una especie de enlace al fichero desde el cual el proceso fué ejecutado; puede abrirse para leer las tablas de símbolos para el proceso.
El fichero
</span><span style="font-size: 10pt"><tt>ctl</tt></span><span style="font-size: 10pt">
puede escribirse con mensajes de texto como 
</span><span style="font-size: 10pt"><tt>stop</tt></span><span style="font-size: 10pt">
o 
</span><span style="font-size: 10pt"><tt>kill</tt></span><span style="font-size: 10pt">
para controlar la ejecución del proceso.
El fichero
</span><span style="font-size: 10pt"><tt>status</tt></span><span style="font-size: 10pt">
contiene una linea de formato fijo de texto con información sobre el proceso: su nombre, dueño, estado, etc.
Pueden escribirse cadenas de texto al fichero 
</span><span style="font-size: 10pt"><tt>note</tt></span><span style="font-size: 10pt">
para que sean enviadas al proceso al como 
</span><span style="font-size: 10pt"><i>notes,</i></span><span style="font-size: 10pt">
análogas a las señales de UNIX.
Proporcionando estos servicios como E/S textual sobre ficheros, en lugar de como llamadas al sistema (como
By providing these services as textual I/O on files rather
</span><span style="font-size: 10pt"><tt>kill</tt></span><span style="font-size: 10pt">)
o operaciones de proposito especial (como
</span><span style="font-size: 10pt"><tt>ptrace</tt></span><span style="font-size: 10pt">),
el dispositivo process de Plan 9 simplifica la implementación de debuggers y programas de ese tipo.
Por ejemplo, el comando
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.40in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">El dispositivo
</span><span style="font-size: 10pt"><i>bitmap</i></span><span style="font-size: 10pt">
contiene 3 ficheros,
</span><span style="font-size: 10pt"><tt>/dev/mouse</tt></span><span style="font-size: 10pt">,
</span><span style="font-size: 10pt"><tt>/dev/screen</tt></span><span style="font-size: 10pt">,
y
</span><span style="font-size: 10pt"><tt>/dev/bitblt</tt></span><span style="font-size: 10pt">,
que ofrecen un interfaz a la pantalla gráfica local (si la hay) y al dispositivo apuntador.
El fichero
</span><span style="font-size: 10pt"><tt>mouse</tt></span><span style="font-size: 10pt">
devuelve un registro de formato fijo que contiene 1 byte para el estado de los botones y 4 bytes más para las posiciones 
</span><span style="font-size: 10pt"><i>x</i></span><span style="font-size: 10pt">
e
</span><span style="font-size: 10pt"><i>y</i></span><span style="font-size: 10pt">
del ratón.
Si no se ha movido desde que el fichero se leyó la última vez, otra lectura se bloquerá.
El fichero 
</span><span style="font-size: 10pt"><tt>screen</tt></span><span style="font-size: 10pt">
contiene la imagen de memoria del contenido de la pantalla;
el fichero 
</span><span style="font-size: 10pt"><tt>bitblt</tt></span><span style="font-size: 10pt">
ofrece un interfaz procedural.
Llamadas a la librería gráfica son traducidas a mensajes que se escriben en el fichero 
</span><span style="font-size: 10pt"><tt>bitblt</tt></span><span style="font-size: 10pt">
para realizar operaciones gráficas. (Esto es esencialmente un protocolo RPC anidado)
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.40in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Todos los servicios que está usando un proceso son reunidos en el 
</span><span style="font-size: 10pt"><i>espacio de nombres
</i></span><span style="font-size: 10pt">del proceso, una jerarquía de nombres de fichero con una sola raíz.
Cuando un proceso bifurca, el proceso hijo comparte el espacio de nombres con el padre.
Varias llamadas del sistema manipulan los espacios de nombres.
Dado un descriptor de fichero
</span><span style="font-size: 10pt"><tt>fd</tt></span><span style="font-size: 10pt">
que guarda un canal de comunicación abierto con un servicio, la llamada
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.40in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">El sistema de ventanas,
</span><span style="font-size: 10pt"><tt>8&frac12;</tt></span><span style="font-size: 10pt">
[Pike91], es un servidor que ofrece ficheros como 
</span><span style="font-size: 10pt"><tt>/dev/cons</tt></span><span style="font-size: 10pt">
y
</span><span style="font-size: 10pt"><tt>/dev/bitblt</tt></span><span style="font-size: 10pt">.
Cada cliente ve una copia diferente de estos ficheros en su espacio de nombres local: hay muchas instancias de 
</span><span style="font-size: 10pt"><tt>/dev/cons</tt></span><span style="font-size: 10pt">,
cada una de ellas servida por
</span><span style="font-size: 10pt"><tt>8&frac12;</tt></span><span style="font-size: 10pt">
al espacio de nombres local de una ventana.
De nuevo
</span><span style="font-size: 10pt"><tt>8&frac12;</tt></span><span style="font-size: 10pt">
implementa los servicios utilizando espacios de nombres locales además de usar E/S a ficheros con nombres convencionales.
Cada cliente simplemente conecta su entrada, su salida y su salida de errores a
</span><span style="font-size: 10pt"><tt>/dev/cons</tt></span><span style="font-size: 10pt">,
con operaciones análogas para acceder a gráficos de mapa de bits.
Compárese esto con la implementación de
</span><span style="font-size: 10pt"><tt>/dev/tty</tt></span><span style="font-size: 10pt">
en UNIX, que está hecha mediante código especial en el nucleo, que sobrecarga el fichero, cuando se abre, con la entrada o salida estandar del proceso.
Se necesitan medidas especiales en UNIX para que 
</span><span style="font-size: 10pt"><tt>/dev/tty</tt></span><span style="font-size: 10pt">
se comporte como se espera en un sistema de ventanas.
</span><span style="font-size: 10pt"><tt>8&frac12;</tt></span><span style="font-size: 10pt">
por el contrario usa la provisión del fichero correspondiente como idea central, y el éxito de ello depende críticamente del espacio de nombres local.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.40in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">El entorno que
</span><span style="font-size: 10pt"><tt>8&frac12;</tt></span><span style="font-size: 10pt">
proporciona a sus clientes es exactamente el mismo entorno en el que está implementado: un conjunto convencional de ficheros en
</span><span style="font-size: 10pt"><tt>/dev</tt></span><span style="font-size: 10pt">.
Esto permite que él mismo sea ejecutado recursivamente en una de sus propias ventanas, lo que es muy util para debugging.
También significa que si los ficheros son exportados a otra máquina, como se describe más adelante, el sistema de ventanas o las aplicaciones cliente pueden ejecutarse de forma transparente en máquinas remotas, incluso si carecen de hardware gráfico.
Este mecanismo es usado para las implementaciones Plan 9 del sistema X Window: X corre como cliente de
</span><span style="font-size: 10pt"><tt>8&frac12;</tt></span><span style="font-size: 10pt">,
a menudo en una máquina remota con mucha memoria.
En esta configuración, usar Ethernet para conectarse a máquinas MIPS, nosotros hemos medido solamente una degradación del 10% de rendimiento en gráficos, comparado con correr X en una máquina con Plan 9.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.40in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Una aplicación inusual de estas ideas es un sistema de ficheros de recopilación estadística, implementado por medio del comando
</span><span style="font-size: 10pt"><tt>iostats</tt></span><span style="font-size: 10pt">.
Este comando encapsula el proceso en un espacio de nombres local, monitoreando solicitudes 9P desde el proceso hacia el mundo exterior &mdash; el espacio de nombres en el que 
</span><span style="font-size: 10pt"><tt>iostats</tt></span><span style="font-size: 10pt">
se está ejecutando. Cuando el comando termina
</span><span style="font-size: 10pt"><tt>iostats</tt></span><span style="font-size: 10pt">
muestra un informe del uso y gráficos de rendimiento de la actividad de ficheros.
Por ejemplo
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.40in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">El comando
</span><span style="font-size: 10pt"><tt>import</tt></span><span style="font-size: 10pt">
conecta una pieza del espacio de nombres desde un sistema remoto al espacio de nombres local.
Su implementación consiste en llamar a la máquina remota y empezar un proceso en ella que sirva el espacio de nombres remoto usando 9P.
Luego llama a 
</span><span style="font-size: 10pt"><tt>mount</tt></span><span style="font-size: 10pt">
para enlazar la conexión con el espacio de nombres y finalmante muere;
el proceso remoto continua sirviendo ficheros.
Un uso es acceder a dispositivos no disponibles localmente. Por ejemplo, para escribir en un disquete, se puede decir
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.40in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Otra aplicación es el debugging remoto:
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.40in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Esta estructura hace muy fácil la creación de pasarelas.
Nosotros tenemos máquinas con interfaces Datakit pero sin interfaz Internet. En una de ellas, uno puede teclear
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.40in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">En la práctica no usamos
</span><span style="font-size: 10pt"><tt>rlogin</tt></span><span style="font-size: 10pt">
o
</span><span style="font-size: 10pt"><tt>telnet</tt></span><span style="font-size: 10pt">
entre máquinas Plan 9. En lugar de eso, el comando
</span><span style="font-size: 10pt"><tt>cpu</tt></span><span style="font-size: 10pt">
reemplaza eficazmente la CPU en una ventana por la de otra máquina, típicamente un rápido servidor de CPU multiprocesador.
El objetivo es recrear el espacio de nombres en la máquina remota, usando el equivalente de
</span><span style="font-size: 10pt"><tt>import</tt></span><span style="font-size: 10pt">
para conectar piezas del espacio de nombres de la terminal con el del proceso (shell) del servidor de CPU, haciendo de la terminal un servidor de ficheros para la CPU.
Las conexiones con los dispositivos locales como el rápido sistema de ficheros siguen siendo locales; solamente los dispositivos residentes de la terminal son importados.
El resultado es diferente del 
</span><span style="font-size: 10pt"><tt>rlogin</tt></span><span style="font-size: 10pt">,
de UNIX, que se mete en un espacio de nombres distinto en la máquina remota, o de la compartición de ficheros con 
</span><span style="font-size: 10pt"><tt>NFS</tt></span><span style="font-size: 10pt">,
que mantiene el mismo espacio de nombres pero fuerza a los procesos a ejecutarse localmente.
Los enganches en 
</span><span style="font-size: 10pt"><tt>/bin</tt></span><span style="font-size: 10pt">
pueden cambiar debido a un cambio en la arquitectura de la CPU, y las redes involucradas pueden ser distintas a causa de un hardware diferente, pero el efecto sigue siendo una simple aceleración del procesador en el espacio de nombres actual.
</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p>
<p style="line-height: 1.2em; margin-left: 1.40in; text-indent: 0.40in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt"><b>Posición
</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.40in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Estos ejemplos ilustran cómo las ideas de representar recursos como sistemas de ficheros y un espacio de nombres por proceso pueden usarse para resolver problemas a menudo en manos de mecanismos más exóticos.
No obstante, hay algunas operaciones en Plan 9 que no se mapean en E/S de ficheros.
Un ejemplo es la creación de procesos.
Podríamos imaginar un mensaje a un fichero de control en 
</span><span style="font-size: 10pt"><tt>/proc</tt></span><span style="font-size: 10pt">
que crease un proceso, pero los detalles de construcción del entorno del mismo &mdash; si abre ficheros, su espacio de nombres, su imagen de memoria, etc. &mdash; serían demasiado intrincados para ser descritos en una simple operación de E/S.
Por eso, los nuevos procesos en Plan 9 son creados simplemente con las llamadas convencionales del sistema 
</span><span style="font-size: 10pt"><tt>rfork</tt></span><span style="font-size: 10pt">
y
</span><span style="font-size: 10pt"><tt>exec;</tt></span><span style="font-size: 10pt">
</span><span style="font-size: 10pt"><tt>/proc</tt></span><span style="font-size: 10pt">
se usa solamente para representar y controlar los procesos existentes.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.40in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Plan 9 no intenta mapear los espacios de nombre de la red en el espacio de nombres del sistema de ficheros, por varias razones.
Las diferentes reglas de direccionamiento para varias redes y protocolos no pueden mapearse uniformemente en un espacio de nombres jerárquico. Aunque pudiese hacerse, los diferentes mecanismos de autenticación, selección de servicios, y control de las conexiones no podría mapearse de manera consistente en operaciones sobre un fichero.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.40in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">La memoria compartida es otro recurso no adecuado para representar por medio de un espacio de nombres de ficheros.
Plan 9 se preocupa de proporcionar mecanismos para permitir a grupos de procesos locales compartir y mapear la memoria. La memoria es controlada mediante llamadas del sistema, en lugar de ficheros especiales, sin embargo, puesto que una representación en el sistema de ficheros podría implicar que la memoria podría ser importada desde máquinas remotas.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.40in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Aparte de estas limitaciones, el sistema de ficheros y los espacios de nombres ofrecen un modelo efectivo en torno al cual construir un sistema distribuido. Bien utilizados, pueden proporcionar un interfaz uniforme, familiar y transparente con un conjunto diverso de recursos distribuidos.
Comportan propiedades de acceso protección y nombrado perfectamente estudiadas. La integración de dispositivos en un sistema de ficheros jerárquico es la mejor idea de UNIX. Plan 9 lleva estos conceptos mucho más alla y muestra que los sistemas de ficheros, cuando se usan de manera inventiva, tienen plena vigencia en la investigación productiva.
</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p>
<p style="line-height: 1.2em; margin-left: 1.40in; text-indent: 0.40in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt"><b>Referencias
</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.40in; text-indent: 0.40in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">[Killian] T. Killian, &lsquo;&lsquo;Processes as Files&rsquo;&rsquo;, USENIX Summer Conf. Proc., Salt Lake City, 1984
</span></p><p style="line-height: 1.2em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">[Needham] R. Needham, &lsquo;&lsquo;Names&rsquo;&rsquo;, in
</span><span style="font-size: 10pt"><i>Distributed systems,
</i></span><span style="font-size: 10pt">S. Mullender, ed.,
Addison Wesley, 1989
</span></p><p style="line-height: 1.2em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">[Pike90] R. Pike, D. Presotto, K. Thompson, H. Trickey,
&lsquo;&lsquo;Plan 9 from Bell Labs&rsquo;&rsquo;,
UKUUG Proc. of the Summer 1990 Conf.,
London, England,
1990
</span></p><p style="line-height: 1.2em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">[Presotto] D. Presotto, &lsquo;&lsquo;Multiprocessor Streams for Plan 9&rsquo;&rsquo;,
UKUUG Proc. of the Summer 1990 Conf.,
London, England,
1990
</span></p><p style="line-height: 1.2em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">[Pike91] Pike, R., &lsquo;&lsquo;8.5, The Plan 9 Window System&rsquo;&rsquo;, USENIX Summer
Conf. Proc., Nashville, 1991
</span></p><p style="margin-top: 0; margin-bottom: 0.50in"></p>
<p style="margin-top: 0; margin-bottom: 0.17in"></p>
<p style="line-height: 1.2em; margin-left: 1.50in; text-indent: 0.35in; margin-right: 1.50in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt"></span><span style="font-size: 10pt"><b>Notes</b></span><span style="font-size: 10pt">
</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p>
<p style="margin-top: 0; margin-bottom: 0.17in"></p>

<p style="line-height: 1.2em; margin-left: 1.50in; text-indent: 0.00in; margin-right: 1.50in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Aparecido en 
</span><span style="font-size: 10pt"><i>Operating Systems Review,
</i></span><span style="font-size: 10pt">Vol. 27, #2, April 1993, págs. 72-76
(reimpreso de
</span><span style="font-size: 10pt"><i>Proceedings of the 5th ACM SIGOPS European Workshop,
</i></span><span style="font-size: 10pt">Mont Saint-Michel, 1992, Paper n&ordm; 34).
</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p>
<p style="margin-top: 0; margin-bottom: 0.17in"></p>





</div>

<div id="footer">
<br class="doNotDisplay doNotPrint" />

<div class="left"><a href="http://werc.cat-v.org/">Powered by werc</a></div>

<div class="right">
<form action="http://www.google.com/cse" id="cse-search-box" style="display: inline">
  <div style="display: inline">
    <input type="hidden" name="cx" value="partner-pub-2060328396151526:ea9sar-xttn" />
    <input type="hidden" name="ie" value="UTF-8" />
    <input type="text" name="q" size="32" />
    <input type="submit" name="sa" value="Search" />
  </div>
</form>
<script type="text/javascript" src="http://www.google.com/coop/cse/brand?form=cse-search-box&lang=en"></script></div>


<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
try {
var pageTracker = _gat._getTracker("UA-1220719-1");
pageTracker._setDomainName("cat-v.org");
pageTracker._trackPageview();

var pageTracker2 = _gat._getTracker("UA-1220719-12");
pageTracker2._trackPageview();
} catch(err) {}</script>
</div>
</body></html>
